--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Node / ReticulumProjects / MeshChatX.git / files / tests / backend / test_call_codec2_regressions.py
Displaying Raw • Download
tests/backend/test_call_codec2_regressions.py bce42bcdce0e7d2c6d78228e864a4cd1d974cc82 (bce42bcd) Text, 12.80 KB
T8b949e# SPDX-License-Identifier: 0BSD
T8b949e"""Regression guards for call contact matching and Codec2/profile selection.
These lock in bugs that broke real calls:
1. Contacts saved under LXMF destination hashes were rejected by contacts-only.
2. Configured audio profiles never reached LXST telephone.call().
3. Invalid legacy profile id 2 silently mapped to Opus instead of a real profile.
4. Codec2 profiles crashed or were unusable when pycodec2/libcodec2 was missing.
5. Incoming calls during outbound dial left the remote ringing forever.
"""
Tff7b72import T7ee787os
Tff7b72import T7ee787tempfile
Tff7b72from T7ee787pathlib Tff7b72import Te6edf3Path
Tff7b72from T7ee787unittestT7ee787.T7ee787mock Tff7b72import Te6edf3MagicMockTb4b4b4, Te6edf3patch
Tff7b72import T7ee787pytest
Tff7b72from T7ee787meshchatxT7ee787.T7ee787meshchat Tff7b72import Te6edf3ReticulumMeshChat
Tff7b72from T7ee787meshchatxT7ee787.T7ee787srcT7ee787.T7ee787backendT7ee787.T7ee787config_manager Tff7b72import Te6edf3ConfigManager
Tff7b72from T7ee787meshchatxT7ee787.T7ee787srcT7ee787.T7ee787backendT7ee787.T7ee787database Tff7b72import Te6edf3Database
Tff7b72from T7ee787meshchatxT7ee787.T7ee787srcT7ee787.T7ee787backendT7ee787.T7ee787databaseT7ee787.T7ee787contacts Tff7b72import Te6edf3ContactsDAO
Tff7b72from T7ee787meshchatxT7ee787.T7ee787srcT7ee787.T7ee787backendT7ee787.T7ee787databaseT7ee787.T7ee787provider Tff7b72import Te6edf3DatabaseProvider
Tff7b72from T7ee787meshchatxT7ee787.T7ee787srcT7ee787.T7ee787backendT7ee787.T7ee787databaseT7ee787.T7ee787schema Tff7b72import Te6edf3DatabaseSchema
Tff7b72from T7ee787meshchatxT7ee787.T7ee787srcT7ee787.T7ee787backendT7ee787.T7ee787telephone_manager Tff7b72import Te6edf3TelephoneManager
Te6edf3pytestTff7b72.Td2a8ffimportorskipTb4b4b4(Ta5d6ff"Ta5d6ffLXSTTa5d6ff"Tb4b4b4)
Tff7b72from T7ee787LXSTT7ee787.T7ee787PrimitivesT7ee787.T7ee787Telephony Tff7b72import Te6edf3Profiles
Te6edf3IDENTITY Tff7b72= Ta5d6ff"Ta5d6ffa1Ta5d6ff" Tff7b72* T79c0ff16
Te6edf3LXMF Tff7b72= Ta5d6ff"Ta5d6ffb2Ta5d6ff" Tff7b72* T79c0ff16
Te6edf3LXST Tff7b72= Ta5d6ff"Ta5d6ffc3Ta5d6ff" Tff7b72* T79c0ff16
Te6edf3CALLER_HASH_HEX Tff7b72= Te6edf3IDENTITY
Tf0883e@pytestTff7b72.Td2a8fffixture
Tff7b72def Td2a8ffcontacts_daoTb4b4b4(Tb4b4b4)Tb4b4b4:
Te6edf3fdTb4b4b4, Te6edf3path Tff7b72= Te6edf3tempfileTff7b72.Td2a8ffmkstempTb4b4b4(Te6edf3suffixTff7b72=Ta5d6ff"Ta5d6ff.dbTa5d6ff"Tb4b4b4)
Te6edf3osTff7b72.Td2a8ffcloseTb4b4b4(Te6edf3fdTb4b4b4)
Te6edf3provider Tff7b72= Te6edf3DatabaseProviderTb4b4b4(Te6edf3pathTb4b4b4)
Te6edf3DatabaseSchemaTb4b4b4(Te6edf3providerTb4b4b4)Tff7b72.Td2a8ffinitializeTb4b4b4(Tb4b4b4)
Tff7b72yield Te6edf3ContactsDAOTb4b4b4(Te6edf3providerTb4b4b4)
Te6edf3providerTff7b72.Td2a8ffcloseTb4b4b4(Tb4b4b4)
Tff7b72if Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffexistsTb4b4b4(Te6edf3pathTb4b4b4)Tb4b4b4:
Te6edf3osTff7b72.Td2a8ffremoveTb4b4b4(Te6edf3pathTb4b4b4)
Tf0883e@pytestTff7b72.Td2a8fffixture
Tff7b72def Td2a8ffconfig_dbTb4b4b4(Tb4b4b4)Tb4b4b4:
Te6edf3fdTb4b4b4, Te6edf3path Tff7b72= Te6edf3tempfileTff7b72.Td2a8ffmkstempTb4b4b4(Te6edf3suffixTff7b72=Ta5d6ff"Ta5d6ff.dbTa5d6ff"Tb4b4b4)
Te6edf3osTff7b72.Td2a8ffcloseTb4b4b4(Te6edf3fdTb4b4b4)
Te6edf3database Tff7b72= Te6edf3DatabaseTb4b4b4(Te6edf3pathTb4b4b4)
Te6edf3databaseTff7b72.Td2a8ffinitializeTb4b4b4(Tb4b4b4)
Tff7b72yield Te6edf3database
Te6edf3databaseTff7b72.Td2a8ffcloseTb4b4b4(Tb4b4b4)
Tff7b72if Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffexistsTb4b4b4(Te6edf3pathTb4b4b4)Tb4b4b4:
Te6edf3osTff7b72.Td2a8ffremoveTb4b4b4(Te6edf3pathTb4b4b4)
Tff7b72def Td2a8ff_caller_identityTb4b4b4(Tb4b4b4)Tb4b4b4:
Te6edf3ident Tff7b72= Te6edf3MagicMockTb4b4b4(Tb4b4b4)
Te6edf3identTff7b72.Td2a8ffhash Tff7b72= Tffa657bytesTff7b72.Td2a8fffromhexTb4b4b4(Te6edf3CALLER_HASH_HEXTb4b4b4)
Tff7b72return Te6edf3ident
Tff7b72def Td2a8ff_policy_appTb4b4b4(Tb4b4b4)Tb4b4b4:
Te6edf3app Tff7b72= Te6edf3ReticulumMeshChatTff7b72.Td2a8ff__new__Tb4b4b4(Te6edf3ReticulumMeshChatTb4b4b4)
Te6edf3ctx Tff7b72= Te6edf3MagicMockTb4b4b4(Tb4b4b4)
Te6edf3tm Tff7b72= Te6edf3MagicMockTb4b4b4(Tb4b4b4)
Te6edf3tmTff7b72.Td2a8ffinitiation_status Tff7b72= Tff7b72None
Te6edf3tmTff7b72.Td2a8fftelephone Tff7b72= Te6edf3MagicMockTb4b4b4(Tb4b4b4)
Te6edf3ctxTff7b72.Td2a8fftelephone_manager Tff7b72= Te6edf3tm
Te6edf3ctxTff7b72.Td2a8ffconfig Tff7b72= Te6edf3MagicMockTb4b4b4(Tb4b4b4)
Te6edf3ctxTff7b72.Td2a8ffdatabase Tff7b72= Te6edf3MagicMockTb4b4b4(Tb4b4b4)
Te6edf3ctxTff7b72.Td2a8ffdatabaseTff7b72.Td2a8ffannouncesTff7b72.Td2a8ffget_announce_by_hashTff7b72.Td2a8ffreturn_value Tff7b72= Tff7b72None
Te6edf3ctxTff7b72.Td2a8ffdatabaseTff7b72.Td2a8ffannouncesTff7b72.Td2a8ffget_announces_by_identity_hashTff7b72.Td2a8ffreturn_value Tff7b72= Tb4b4b4[Tb4b4b4]
Te6edf3ctxTff7b72.Td2a8ffvoicemail_manager Tff7b72= Te6edf3MagicMockTb4b4b4(Tb4b4b4)
Te6edf3appTff7b72.Td2a8ffcurrent_context Tff7b72= Te6edf3ctx
Te6edf3appTff7b72.Td2a8ffis_destination_blocked Tff7b72= Te6edf3MagicMockTb4b4b4(Te6edf3return_valueTff7b72=Tff7b72FalseTb4b4b4)
Te6edf3appTff7b72.Td2a8ffwebsocket_broadcast Tff7b72= Te6edf3MagicMockTb4b4b4(Tb4b4b4)
Te6edf3appTff7b72.Td2a8ffget_name_for_identity_hash Tff7b72= Te6edf3MagicMockTb4b4b4(Te6edf3return_valueTff7b72=Ta5d6ff"Ta5d6ffCallerTa5d6ff"Tb4b4b4)
Te6edf3appTff7b72.Td2a8ffget_lxmf_destination_hash_for_identity_hash Tff7b72= Te6edf3MagicMockTb4b4b4(Te6edf3return_valueTff7b72=Te6edf3LXMFTb4b4b4)
Te6edf3appTff7b72.Td2a8ffget_lxst_telephony_hash_for_identity_hash Tff7b72= Te6edf3MagicMockTb4b4b4(Te6edf3return_valueTff7b72=Te6edf3LXSTTb4b4b4)
Tff7b72return Te6edf3app
Tff7b72class T56d364TestContactsOnlyIdentityVsLxmfRegressionTb4b4b4:
T8b949e"""Chat UI often stores LXMF dest as remote_identity_hash; calls use identity hash."""
Tff7b72def Td2a8fftest_dao_matches_identity_via_related_lxmf_hashTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3contacts_daoTb4b4b4)Tb4b4b4:
T8b949e# Broken historical save: LXMF destination used as primary key
Te6edf3contacts_daoTff7b72.Td2a8ffadd_contactTb4b4b4(Ta5d6ff"Ta5d6ffFriendTa5d6ff"Tb4b4b4, Te6edf3LXMFTb4b4b4, Te6edf3lxmf_addressTff7b72=Te6edf3LXMFTb4b4b4)
Tff7b72assert Te6edf3contacts_daoTff7b72.Td2a8ffget_contact_by_identity_hashTb4b4b4(Te6edf3IDENTITYTb4b4b4) Tff7b72is Tff7b72None
Te6edf3matched Tff7b72= Te6edf3contacts_daoTff7b72.Td2a8ffget_contact_by_identity_hashTb4b4b4(
Te6edf3IDENTITYTb4b4b4,
Te6edf3related_hashesTff7b72=Tb4b4b4[Te6edf3LXMFTb4b4b4]Tb4b4b4,
Tb4b4b4)
Tff7b72assert Te6edf3matched Tff7b72is Tff7b72not Tff7b72None
Tff7b72assert Te6edf3matchedTb4b4b4[Ta5d6ff"Ta5d6ffnameTa5d6ff"Tb4b4b4] Tff7b72== Ta5d6ff"Ta5d6ffFriendTa5d6ff"
Tff7b72def Td2a8fftest_is_contact_true_for_identity_when_saved_as_lxmfTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Te6edf3contact Tff7b72= Tb4b4b4{Ta5d6ff"Ta5d6ffidTa5d6ff"Tb4b4b4: T79c0ff1Tb4b4b4, Ta5d6ff"Ta5d6ffnameTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffFriendTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffremote_identity_hashTa5d6ff"Tb4b4b4: Te6edf3LXMFTb4b4b4}
Tff7b72def Td2a8fflookupTb4b4b4(Te6edf3primaryTb4b4b4, Te6edf3related_hashesTff7b72=Tff7b72NoneTb4b4b4)Tb4b4b4:
Te6edf3keys Tff7b72= Tb4b4b4{Te6edf3primaryTb4b4b4, Tff7b72*Tb4b4b4(Te6edf3related_hashes Tff7b72or Tb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4}
Tff7b72if Te6edf3LXMF Tff7b72in Te6edf3keysTb4b4b4:
Tff7b72return Te6edf3contact
Tff7b72return Tff7b72None
Te6edf3app Tff7b72= Te6edf3ReticulumMeshChatTff7b72.Td2a8ff__new__Tb4b4b4(Te6edf3ReticulumMeshChatTb4b4b4)
Te6edf3ctx Tff7b72= Te6edf3MagicMockTb4b4b4(Tb4b4b4)
Te6edf3ctxTff7b72.Td2a8ffdatabase Tff7b72= Te6edf3MagicMockTb4b4b4(Tb4b4b4)
Te6edf3ctxTff7b72.Td2a8ffdatabaseTff7b72.Td2a8ffannouncesTff7b72.Td2a8ffget_announce_by_hashTff7b72.Td2a8ffreturn_value Tff7b72= Tff7b72None
Te6edf3ctxTff7b72.Td2a8ffdatabaseTff7b72.Td2a8ffannouncesTff7b72.Td2a8ffget_announces_by_identity_hashTff7b72.Td2a8ffreturn_value Tff7b72= Tb4b4b4[
Tb4b4b4{
Ta5d6ff"Ta5d6ffdestination_hashTa5d6ff"Tb4b4b4: Te6edf3LXMFTb4b4b4,
Ta5d6ff"Ta5d6ffidentity_hashTa5d6ff"Tb4b4b4: Te6edf3IDENTITYTb4b4b4,
Ta5d6ff"Ta5d6ffaspectTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6fflxmf.deliveryTa5d6ff"Tb4b4b4,
Tb4b4b4}Tb4b4b4,
Tb4b4b4]
Te6edf3ctxTff7b72.Td2a8ffdatabaseTff7b72.Td2a8ffcontactsTff7b72.Td2a8ffget_contact_by_identity_hashTff7b72.Td2a8ffside_effect Tff7b72= Te6edf3lookup
Te6edf3appTff7b72.Td2a8ffcurrent_context Tff7b72= Te6edf3ctx
Te6edf3appTff7b72.Td2a8ffget_lxmf_destination_hash_for_identity_hash Tff7b72= Te6edf3MagicMockTb4b4b4(Te6edf3return_valueTff7b72=Te6edf3LXMFTb4b4b4)
Te6edf3appTff7b72.Td2a8ffget_lxst_telephony_hash_for_identity_hash Tff7b72= Te6edf3MagicMockTb4b4b4(Te6edf3return_valueTff7b72=Te6edf3LXSTTb4b4b4)
Tff7b72assert Te6edf3appTff7b72.Td2a8ff_is_contactTb4b4b4(Te6edf3IDENTITYTb4b4b4) Tff7b72is Tff7b72True
Tff7b72def Td2a8fftest_incoming_contacts_only_allows_lxmf_saved_contactTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Te6edf3app Tff7b72= Te6edf3_policy_appTb4b4b4(Tb4b4b4)
Te6edf3appTff7b72.Td2a8ffconfigTff7b72.Td2a8ffdo_not_disturb_enabledTff7b72.Td2a8ffgetTff7b72.Td2a8ffreturn_value Tff7b72= Tff7b72False
Te6edf3appTff7b72.Td2a8ffconfigTff7b72.Td2a8fftelephone_allow_calls_from_contacts_onlyTff7b72.Td2a8ffgetTff7b72.Td2a8ffreturn_value Tff7b72= Tff7b72True
Te6edf3appTff7b72.Td2a8ffconfigTff7b72.Td2a8ffblock_all_from_strangersTff7b72.Td2a8ffgetTff7b72.Td2a8ffreturn_value Tff7b72= Tff7b72False
Te6edf3appTff7b72.Td2a8ffconfigTff7b72.Td2a8fftelephone_enabledTff7b72.Td2a8ffgetTff7b72.Td2a8ffreturn_value Tff7b72= Tff7b72True
Te6edf3appTff7b72.Td2a8ffcurrent_contextTff7b72.Td2a8ffdatabaseTff7b72.Td2a8ffannouncesTff7b72.Td2a8ffget_announces_by_identity_hashTff7b72.Td2a8ffreturn_value Tff7b72= Tb4b4b4[
Tb4b4b4{
Ta5d6ff"Ta5d6ffdestination_hashTa5d6ff"Tb4b4b4: Te6edf3LXMFTb4b4b4,
Ta5d6ff"Ta5d6ffidentity_hashTa5d6ff"Tb4b4b4: Te6edf3IDENTITYTb4b4b4,
Ta5d6ff"Ta5d6ffaspectTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6fflxmf.deliveryTa5d6ff"Tb4b4b4,
Tb4b4b4}Tb4b4b4,
Tb4b4b4]
Tff7b72def Td2a8fflookupTb4b4b4(Te6edf3primaryTb4b4b4, Te6edf3related_hashesTff7b72=Tff7b72NoneTb4b4b4)Tb4b4b4:
Te6edf3keys Tff7b72= Tb4b4b4{Te6edf3primaryTb4b4b4, Tff7b72*Tb4b4b4(Te6edf3related_hashes Tff7b72or Tb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4}
Tff7b72if Te6edf3LXMF Tff7b72in Te6edf3keys Tff7b72or Te6edf3IDENTITY Tff7b72in Te6edf3keysTb4b4b4:
Tff7b72return Tb4b4b4{Ta5d6ff"Ta5d6ffidTa5d6ff"Tb4b4b4: T79c0ff1Tb4b4b4, Ta5d6ff"Ta5d6ffnameTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffFriendTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffremote_identity_hashTa5d6ff"Tb4b4b4: Te6edf3LXMFTb4b4b4}
Tff7b72return Tff7b72None
Te6edf3appTff7b72.Td2a8ffcurrent_contextTff7b72.Td2a8ffdatabaseTff7b72.Td2a8ffcontactsTff7b72.Td2a8ffget_contact_by_identity_hashTff7b72.Td2a8ffside_effect Tff7b72= Te6edf3lookup
Te6edf3caller Tff7b72= Te6edf3_caller_identityTb4b4b4(Tb4b4b4)
Tff7b72with Te6edf3patchTb4b4b4(Ta5d6ff"Ta5d6ffmeshchatx.meshchat.AsyncUtilsTa5d6ff"Tb4b4b4) Tff7b72as Te6edf3async_utilsTb4b4b4:
Te6edf3async_utilsTff7b72.Td2a8ffrun_async Tff7b72= Te6edf3MagicMockTb4b4b4(Tb4b4b4)
Te6edf3ReticulumMeshChatTff7b72.Td2a8ffon_incoming_telephone_callTb4b4b4(Te6edf3appTb4b4b4, Te6edf3callerTb4b4b4)
Te6edf3appTff7b72.Td2a8ffcurrent_contextTff7b72.Td2a8ffvoicemail_managerTff7b72.Td2a8ffhandle_incoming_callTff7b72.Td2a8ffassert_called_onceTb4b4b4(Tb4b4b4)
Te6edf3appTff7b72.Td2a8ffcurrent_contextTff7b72.Td2a8fftelephone_managerTff7b72.Td2a8fftelephoneTff7b72.Td2a8ffhangupTff7b72.Td2a8ffassert_not_calledTb4b4b4(Tb4b4b4)
Te6edf3async_utilsTff7b72.Td2a8ffrun_asyncTff7b72.Td2a8ffassert_called_onceTb4b4b4(Tb4b4b4)
Tff7b72class T56d364TestIncomingWhileDialingRegressionTb4b4b4:
Tff7b72def Td2a8fftest_rejects_with_hangup_instead_of_silent_ignoreTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Te6edf3app Tff7b72= Te6edf3_policy_appTb4b4b4(Tb4b4b4)
Te6edf3appTff7b72.Td2a8ffcurrent_contextTff7b72.Td2a8fftelephone_managerTff7b72.Td2a8ffinitiation_status Tff7b72= Ta5d6ff"Ta5d6ffCalling...Ta5d6ff"
Te6edf3caller Tff7b72= Te6edf3_caller_identityTb4b4b4(Tb4b4b4)
Tff7b72with Te6edf3patchTb4b4b4(Ta5d6ff"Ta5d6ffmeshchatx.meshchat.threading.TimerTa5d6ff"Tb4b4b4) Tff7b72as Te6edf3mock_timerTb4b4b4:
Tff7b72def Td2a8ffrun_timerTb4b4b4(Te6edf3delayTb4b4b4, Te6edf3fnTb4b4b4)Tb4b4b4:
Te6edf3fnTb4b4b4(Tb4b4b4)
Te6edf3t Tff7b72= Te6edf3MagicMockTb4b4b4(Tb4b4b4)
Te6edf3tTff7b72.Td2a8ffstart Tff7b72= Te6edf3MagicMockTb4b4b4(Tb4b4b4)
Tff7b72return Te6edf3t
Te6edf3mock_timerTff7b72.Td2a8ffside_effect Tff7b72= Te6edf3run_timer
Tff7b72with Te6edf3patchTb4b4b4(Ta5d6ff"Ta5d6ffmeshchatx.meshchat.AsyncUtilsTa5d6ff"Tb4b4b4) Tff7b72as Te6edf3async_utilsTb4b4b4:
Te6edf3async_utilsTff7b72.Td2a8ffrun_async Tff7b72= Te6edf3MagicMockTb4b4b4(Tb4b4b4)
Te6edf3ReticulumMeshChatTff7b72.Td2a8ffon_incoming_telephone_callTb4b4b4(Te6edf3appTb4b4b4, Te6edf3callerTb4b4b4)
Te6edf3appTff7b72.Td2a8ffcurrent_contextTff7b72.Td2a8fftelephone_managerTff7b72.Td2a8fftelephoneTff7b72.Td2a8ffhangupTff7b72.Td2a8ffassert_called_onceTb4b4b4(Tb4b4b4)
Te6edf3appTff7b72.Td2a8ffcurrent_contextTff7b72.Td2a8ffvoicemail_managerTff7b72.Td2a8ffhandle_incoming_callTff7b72.Td2a8ffassert_not_calledTb4b4b4(Tb4b4b4)
Tff7b72class T56d364TestAudioProfilePassthroughRegressionTb4b4b4:
T8b949e"""LXST switch_profile is a no-op when idle; profile must go to call()."""
Tf0883e@pytestTff7b72.Td2a8ffmarkTff7b72.Td2a8ffasyncio
Tff7b72async Tff7b72def Td2a8fftest_outbound_call_receives_codec2_profileTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Te6edf3tm Tff7b72= Te6edf3TelephoneManagerTb4b4b4(Te6edf3identityTff7b72=Te6edf3MagicMockTb4b4b4(Tb4b4b4)Tb4b4b4)
Te6edf3tmTff7b72.Td2a8fftelephone Tff7b72= Te6edf3MagicMockTb4b4b4(Tb4b4b4)
Te6edf3tmTff7b72.Td2a8fftelephoneTff7b72.Td2a8ffbusy Tff7b72= Tff7b72False
Te6edf3tmTff7b72.Td2a8fftelephoneTff7b72.Td2a8ffcall_status Tff7b72= T79c0ff3
Te6edf3tmTff7b72.Td2a8fftelephoneTff7b72.Td2a8ffactive_call Tff7b72= Tff7b72None
Te6edf3tmTff7b72.Td2a8ff_path_poll_interval_s Tff7b72= T79c0ff0.005
Te6edf3tmTff7b72.Td2a8ff_path_retry_interval_s Tff7b72= T79c0ff0.01
Te6edf3tmTff7b72.Td2a8ff_status_poll_interval_s Tff7b72= T79c0ff0.01
Te6edf3tmTff7b72.Td2a8ffpreferred_profile_id Tff7b72= Te6edf3ProfilesTff7b72.Td2a8ffBANDWIDTH_LOW
Te6edf3seen Tff7b72= Tb4b4b4{Tb4b4b4}
Tff7b72def Td2a8ffcapture_callTb4b4b4(Te6edf3identityTb4b4b4, Te6edf3profileTff7b72=Tff7b72NoneTb4b4b4)Tb4b4b4:
Te6edf3seenTb4b4b4[Ta5d6ff"Ta5d6ffprofileTa5d6ff"Tb4b4b4] Tff7b72= Te6edf3profile
Te6edf3tmTff7b72.Td2a8fftelephoneTff7b72.Td2a8ffcall_status Tff7b72= T79c0ff0
Te6edf3tmTff7b72.Td2a8fftelephoneTff7b72.Td2a8ffcallTff7b72.Td2a8ffside_effect Tff7b72= Te6edf3capture_call
Te6edf3destination_hash Tff7b72= Tffa657bytesTff7b72.Td2a8fffromhexTb4b4b4(Ta5d6ff"Ta5d6ffaaTa5d6ff" Tff7b72* T79c0ff16Tb4b4b4)
Tff7b72with Tb4b4b4(
Te6edf3patchTb4b4b4(
Ta5d6ff"Ta5d6ffmeshchatx.src.backend.telephone_manager.RNS.Identity.recallTa5d6ff"Tb4b4b4,
Te6edf3return_valueTff7b72=Te6edf3MagicMockTb4b4b4(Tb4b4b4)Tb4b4b4,
Tb4b4b4)Tb4b4b4,
Te6edf3patchTb4b4b4(
Ta5d6ff"Ta5d6ffmeshchatx.src.backend.telephone_manager.RNS.Transport.has_pathTa5d6ff"Tb4b4b4,
Te6edf3return_valueTff7b72=Tff7b72TrueTb4b4b4,
Tb4b4b4)Tb4b4b4,
Te6edf3patchTff7b72.Td2a8ffobjectTb4b4b4(Te6edf3TelephoneManagerTb4b4b4, Ta5d6ff"Ta5d6ffcodec2_availableTa5d6ff"Tb4b4b4, Te6edf3return_valueTff7b72=Tff7b72TrueTb4b4b4)Tb4b4b4,
Te6edf3patchTb4b4b4(
Ta5d6ff"Ta5d6ffmeshchatx.src.backend.telephone_manager.RNS.DestinationTa5d6ff"Tb4b4b4,
Tb4b4b4) Tff7b72as Te6edf3dest_clsTb4b4b4,
Tb4b4b4)Tb4b4b4:
Te6edf3dest_clsTff7b72.Td2a8ffreturn_valueTff7b72.Td2a8ffhash Tff7b72= Te6edf3destination_hash
Tff7b72await Te6edf3tmTff7b72.Td2a8ffinitiateTb4b4b4(Te6edf3destination_hashTb4b4b4, Te6edf3timeout_secondsTff7b72=T79c0ff1Tb4b4b4)
Tff7b72assert Te6edf3seenTb4b4b4[Ta5d6ff"Ta5d6ffprofileTa5d6ff"Tb4b4b4] Tff7b72== Te6edf3ProfilesTff7b72.Td2a8ffBANDWIDTH_LOW
Tff7b72def Td2a8fftest_init_does_not_rely_on_idle_switch_profileTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3tmp_pathTb4b4b4)Tb4b4b4:
Te6edf3cfg Tff7b72= Te6edf3MagicMockTb4b4b4(Tb4b4b4)
Te6edf3cfgTff7b72.Td2a8fftelephone_enabledTff7b72.Td2a8ffgetTff7b72.Td2a8ffreturn_value Tff7b72= Tff7b72True
Te6edf3cfgTff7b72.Td2a8fftelephone_audio_profile_idTff7b72.Td2a8ffgetTff7b72.Td2a8ffreturn_value Tff7b72= Te6edf3ProfilesTff7b72.Td2a8ffBANDWIDTH_VERY_LOW
Tff7b72with Tb4b4b4(
Te6edf3patchTb4b4b4(
Ta5d6ff"Ta5d6ffmeshchatx.src.backend.telephone_manager.TelephoneTa5d6ff"Tb4b4b4,
Tb4b4b4) Tff7b72as Te6edf3telephone_clsTb4b4b4,
Te6edf3patchTff7b72.Td2a8ffobjectTb4b4b4(Te6edf3TelephoneManagerTb4b4b4, Ta5d6ff"Ta5d6ffcodec2_availableTa5d6ff"Tb4b4b4, Te6edf3return_valueTff7b72=Tff7b72TrueTb4b4b4)Tb4b4b4,
Tb4b4b4)Tb4b4b4:
Te6edf3telephone Tff7b72= Te6edf3telephone_clsTff7b72.Td2a8ffreturn_value
Te6edf3tm Tff7b72= Te6edf3TelephoneManagerTb4b4b4(
Te6edf3identityTff7b72=Te6edf3MagicMockTb4b4b4(Tb4b4b4)Tb4b4b4,
Te6edf3config_managerTff7b72=Te6edf3cfgTb4b4b4,
Te6edf3storage_dirTff7b72=Tffa657strTb4b4b4(Te6edf3tmp_pathTb4b4b4)Tb4b4b4,
Tb4b4b4)
Te6edf3tmTff7b72.Td2a8ffinit_telephoneTb4b4b4(Tb4b4b4)
Tff7b72assert Te6edf3tmTff7b72.Td2a8ffpreferred_profile_id Tff7b72== Te6edf3ProfilesTff7b72.Td2a8ffBANDWIDTH_VERY_LOW
Te6edf3telephoneTff7b72.Td2a8ffswitch_profileTff7b72.Td2a8ffassert_not_calledTb4b4b4(Tb4b4b4)
Tff7b72def Td2a8fftest_invalid_legacy_profile_two_falls_backTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Te6edf3tm Tff7b72= Te6edf3TelephoneManagerTb4b4b4(Te6edf3identityTff7b72=Te6edf3MagicMockTb4b4b4(Tb4b4b4)Tb4b4b4)
Tff7b72assert Te6edf3tmTff7b72.Td2a8ffresolve_audio_profile_idTb4b4b4(T79c0ff2Tb4b4b4) Tff7b72== Te6edf3ProfilesTff7b72.Td2a8ffDEFAULT_PROFILE
Tff7b72def Td2a8fftest_codec2_unavailable_falls_back_to_opus_defaultTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Te6edf3tm Tff7b72= Te6edf3TelephoneManagerTb4b4b4(Te6edf3identityTff7b72=Te6edf3MagicMockTb4b4b4(Tb4b4b4)Tb4b4b4)
Tff7b72with Te6edf3patchTff7b72.Td2a8ffobjectTb4b4b4(Te6edf3TelephoneManagerTb4b4b4, Ta5d6ff"Ta5d6ffcodec2_availableTa5d6ff"Tb4b4b4, Te6edf3return_valueTff7b72=Tff7b72FalseTb4b4b4)Tb4b4b4:
Tff7b72assert Tb4b4b4(
Te6edf3tmTff7b72.Td2a8ffresolve_audio_profile_idTb4b4b4(Te6edf3ProfilesTff7b72.Td2a8ffBANDWIDTH_ULTRA_LOWTb4b4b4)
Tff7b72== Te6edf3ProfilesTff7b72.Td2a8ffDEFAULT_PROFILE
Tb4b4b4)
Tff7b72class T56d364TestLegacyProfileMigrationRegressionTb4b4b4:
Tff7b72def Td2a8fftest_persisted_profile_two_migrates_to_defaultTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3config_dbTb4b4b4)Tb4b4b4:
Te6edf3config Tff7b72= Te6edf3ConfigManagerTb4b4b4(Te6edf3config_dbTb4b4b4)
Te6edf3configTff7b72.Td2a8fftelephone_audio_profile_idTff7b72.Td2a8ffsetTb4b4b4(T79c0ff2Tb4b4b4)
Te6edf3reloaded Tff7b72= Te6edf3ConfigManagerTb4b4b4(Te6edf3config_dbTb4b4b4)
Tff7b72assert Te6edf3reloadedTff7b72.Td2a8fftelephone_audio_profile_idTff7b72.Td2a8ffgetTb4b4b4(Tb4b4b4) Tff7b72== T79c0ff64
Tff7b72def Td2a8fftest_fresh_default_is_lxst_default_profileTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3config_dbTb4b4b4)Tb4b4b4:
Te6edf3config Tff7b72= Te6edf3ConfigManagerTb4b4b4(Te6edf3config_dbTb4b4b4)
Tff7b72assert Te6edf3configTff7b72.Td2a8fftelephone_audio_profile_idTff7b72.Td2a8ffgetTb4b4b4(Tb4b4b4) Tff7b72== Te6edf3ProfilesTff7b72.Td2a8ffDEFAULT_PROFILE
Tff7b72class T56d364TestAndroidCodec2PackagingRegressionTb4b4b4:
Tff7b72def Td2a8fftest_vendor_wheels_include_libcodec2_for_all_abisTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72import T7ee787zipfile
Tff7b72import T7ee787pytest
Te6edf3vendor Tff7b72= Te6edf3PathTb4b4b4(Tff7b72__file__Tb4b4b4)Tff7b72.Td2a8ffresolveTb4b4b4(Tb4b4b4)Tff7b72.Td2a8ffparentsTb4b4b4[T79c0ff2Tb4b4b4] Tff7b72/ Ta5d6ff"Ta5d6ffandroidTa5d6ff" Tff7b72/ Ta5d6ff"Ta5d6ffvendorTa5d6ff"
Tff7b72if Tff7b72not Te6edf3vendorTff7b72.Td2a8ffis_dirTb4b4b4(Tb4b4b4)Tb4b4b4:
Te6edf3pytestTff7b72.Td2a8ffskipTb4b4b4(Ta5d6ff"Ta5d6ffandroid/vendor not present (gitignored)Ta5d6ff"Tb4b4b4)
Tff7b72for Te6edf3abi Tff7b72in Tb4b4b4(Ta5d6ff"Ta5d6ffarm64_v8aTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffarmeabi_v7aTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffx86_64Ta5d6ff"Tb4b4b4)Tb4b4b4:
Te6edf3wheels Tff7b72= Tffa657sortedTb4b4b4(Te6edf3vendorTff7b72.Td2a8ffglobTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffpycodec2-*-android_24_Tffd700{Te6edf3abiTffd700}Ta5d6ff.whlTa5d6ff"Tb4b4b4)Tb4b4b4)
Tff7b72if Tff7b72not Te6edf3wheelsTb4b4b4:
Te6edf3pytestTff7b72.Td2a8ffskipTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffmissing pycodec2 for Tffd700{Te6edf3abiTffd700}Ta5d6ff"Tb4b4b4)
Tff7b72with Te6edf3zipfileTff7b72.Td2a8ffZipFileTb4b4b4(Te6edf3wheelsTb4b4b4[Tff7b72-T79c0ff1Tb4b4b4]Tb4b4b4) Tff7b72as Te6edf3zinTb4b4b4:
Tff7b72assert Ta5d6ff"Ta5d6ffpycodec2/libcodec2.soTa5d6ff" Tff7b72in Te6edf3zinTff7b72.Td2a8ffnamelistTb4b4b4(Tb4b4b4)
Te6edf3lib_wheels Tff7b72= Tffa657sortedTb4b4b4(
Te6edf3vendorTff7b72.Td2a8ffglobTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffchaquopy_libcodec2-*-android_24_Tffd700{Te6edf3abiTffd700}Ta5d6ff.whlTa5d6ff"Tb4b4b4)Tb4b4b4,
Tb4b4b4)
Tff7b72if Tff7b72not Te6edf3lib_wheelsTb4b4b4:
Te6edf3pytestTff7b72.Td2a8ffskipTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffmissing chaquopy_libcodec2 for Tffd700{Te6edf3abiTffd700}Ta5d6ff"Tb4b4b4)
Tff7b72with Te6edf3zipfileTff7b72.Td2a8ffZipFileTb4b4b4(Te6edf3lib_wheelsTb4b4b4[Tff7b72-T79c0ff1Tb4b4b4]Tb4b4b4) Tff7b72as Te6edf3zinTb4b4b4:
Tff7b72assert Ta5d6ff"Ta5d6ffchaquopy/lib/libcodec2.soTa5d6ff" Tff7b72in Te6edf3zinTff7b72.Td2a8ffnamelistTb4b4b4(Tb4b4b4)
Tff7b72def Td2a8fftest_android_lxst_get_codec_guards_missing_codec2Tb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72import T7ee787zipfile
Tff7b72import T7ee787pytest
Te6edf3whl Tff7b72= Tb4b4b4(
Te6edf3PathTb4b4b4(Tff7b72__file__Tb4b4b4)Tff7b72.Td2a8ffresolveTb4b4b4(Tb4b4b4)Tff7b72.Td2a8ffparentsTb4b4b4[T79c0ff2Tb4b4b4]
Tff7b72/ Ta5d6ff"Ta5d6ffandroidTa5d6ff"
Tff7b72/ Ta5d6ff"Ta5d6ffvendorTa5d6ff"
Tff7b72/ Ta5d6ff"Ta5d6fflxst-0.4.8-py3-none-any.whlTa5d6ff"
Tb4b4b4)
Tff7b72if Tff7b72not Te6edf3whlTff7b72.Td2a8ffis_fileTb4b4b4(Tb4b4b4)Tb4b4b4:
Te6edf3pytestTff7b72.Td2a8ffskipTb4b4b4(Ta5d6ff"Ta5d6ffandroid/vendor/lxst wheel not present (gitignored)Ta5d6ff"Tb4b4b4)
Tff7b72with Te6edf3zipfileTff7b72.Td2a8ffZipFileTb4b4b4(Te6edf3whlTb4b4b4) Tff7b72as Te6edf3zinTb4b4b4:
Te6edf3telephony Tff7b72= Te6edf3zinTff7b72.Td2a8ffreadTb4b4b4(Ta5d6ff"Ta5d6ffLXST/Primitives/Telephony.pyTa5d6ff"Tb4b4b4)Tff7b72.Td2a8ffdecodeTb4b4b4(Tb4b4b4)
Te6edf3codecs_init Tff7b72= Te6edf3zinTff7b72.Td2a8ffreadTb4b4b4(Ta5d6ff"Ta5d6ffLXST/Codecs/__init__.pyTa5d6ff"Tb4b4b4)Tff7b72.Td2a8ffdecodeTb4b4b4(Tb4b4b4)
Tff7b72assert Ta5d6ff"Ta5d6ffif Codec2 is not None:Ta5d6ff" Tff7b72in Te6edf3telephony
Tff7b72assert Ta5d6ff"Ta5d6ff_CODEC2_IMPORT_ERRORTa5d6ff" Tff7b72in Te6edf3codecs_init
Tff7b72def Td2a8fftest_pycodec2_roundtrip_for_call_codec2_profilesTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72import T7ee787numpy Tff7b72as T7ee787np
Tff7b72from T7ee787LXSTT7ee787.T7ee787Codecs Tff7b72import Te6edf3Codec2
Tff7b72assert Te6edf3TelephoneManagerTff7b72.Td2a8ffcodec2_availableTb4b4b4(Tb4b4b4) Tff7b72is Tff7b72True
Tff7b72for Te6edf3pid Tff7b72in Tb4b4b4(
Te6edf3ProfilesTff7b72.Td2a8ffBANDWIDTH_ULTRA_LOWTb4b4b4,
Te6edf3ProfilesTff7b72.Td2a8ffBANDWIDTH_VERY_LOWTb4b4b4,
Te6edf3ProfilesTff7b72.Td2a8ffBANDWIDTH_LOWTb4b4b4,
Tb4b4b4)Tb4b4b4:
Te6edf3codec Tff7b72= Te6edf3ProfilesTff7b72.Td2a8ffget_codecTb4b4b4(Te6edf3pidTb4b4b4)
Tff7b72assert Tffa657isinstanceTb4b4b4(Te6edf3codecTb4b4b4, Te6edf3Codec2Tb4b4b4)
Te6edf3spf Tff7b72= Te6edf3codecTff7b72.Td2a8ffc2Tff7b72.Td2a8ffsamples_per_frameTb4b4b4(Tb4b4b4)
Te6edf3pcm Tff7b72= Tb4b4b4(T79c0ff0.05 Tff7b72* Te6edf3npTff7b72.Td2a8ffsinTb4b4b4(Te6edf3npTff7b72.Td2a8fflinspaceTb4b4b4(T79c0ff0Tb4b4b4, T79c0ff4 Tff7b72* Te6edf3npTff7b72.Td2a8ffpiTb4b4b4, Te6edf3spfTb4b4b4)Tb4b4b4)Tb4b4b4)Tff7b72.Td2a8ffastypeTb4b4b4(Te6edf3npTff7b72.Td2a8fffloat32Tb4b4b4)
Te6edf3pcm_i16 Tff7b72= Tb4b4b4(Te6edf3pcm Tff7b72* T79c0ff32767Tb4b4b4)Tff7b72.Td2a8ffastypeTb4b4b4(Te6edf3npTff7b72.Td2a8ffint16Tb4b4b4)
Te6edf3encoded Tff7b72= Te6edf3codecTff7b72.Td2a8ffc2Tff7b72.Td2a8ffencodeTb4b4b4(Te6edf3pcm_i16Tb4b4b4)
Te6edf3decoded Tff7b72= Te6edf3codecTff7b72.Td2a8ffc2Tff7b72.Td2a8ffdecodeTb4b4b4(Te6edf3encodedTb4b4b4)
Tff7b72assert Tffa657lenTb4b4b4(Te6edf3encodedTb4b4b4) Tff7b72== Te6edf3codecTff7b72.Td2a8ffc2Tff7b72.Td2a8ffbytes_per_frameTb4b4b4(Tb4b4b4)
Tff7b72assert Tffa657lenTb4b4b4(Te6edf3decodedTb4b4b4) Tff7b72== Te6edf3spf
──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────